package controlsystem;

import java.util.Date;
import java.util.ArrayList;

import managesystem.Student;
import tracksystem.Activity;
import tracksystem.SchoolActivity;

/**
 * @author Stijn Hoskens
 * Deze klasse controleert na elke activity die de student ingeeft of hij een welbepaalde badge verdient
 * Die badge haalt hij uit een array met badges.
 */

public class BadgeController {
	
	private Badge[] badges;
	private ArrayList<Badge> studentsBadges;
	private Student currStudent;
	private Badge latestBadge;
	
	/**
	 * Constructor voor een BadgeController-object, de currStudent wordt ingesteld en zijn reeds behaalde
	 * badges worden al opgeslagen in studentsBadges (een array zodat wanneer de student in aanmerking komt
	 * voor een badge, hij gemakkelijk kan vergelijken, badges[i] == studentsBadges[i]? of hij die badge
	 * al bezit. De array met badges wordt geladen.
	 */
	public BadgeController(Student student)
	{
		currStudent = student;
		studentsBadges = currStudent.getBadges();
		loadBadges();
	}
	
	/**
	 * Deze methode wordt uitgevoerd elke keer als een activity wordt ingevoerd in het systeem. 
	 * Als het een schoolactivity betreft, gaat men heel de lijst met activities af en worden het totaal aantal
	 * uren en de pagina's van het desbetreffende vak gelezen en kan men nakijken of de student in aanmerking
	 * komt voor een badge.
	 * @param activity
	 */
	public void checkBadge(Activity activity)
	{
		if(activity instanceof SchoolActivity)
		{
			SchoolActivity schoolActivity = (SchoolActivity) activity;
			ArrayList<Activity> allActivities = currStudent.getAct();
			String courseName = schoolActivity.getCourse().getName();
			long totalMSecs = 0;
			int amountOfPages = 0;
			long studyPointsMSecs = schoolActivity.getCourse().getStudyPoints()*99000000;
			Date currDate = new Date(); 
			Badge latestBadge = null;
			for(int i = 0; i != allActivities.size(); i++)
			{
				if(allActivities.get(i) instanceof SchoolActivity)
				{
					SchoolActivity listedSchoolActivity = (SchoolActivity) allActivities.get(i);
					if(listedSchoolActivity.getCourse().getName().equals(courseName))
					{
						totalMSecs += listedSchoolActivity.getDuration();
						amountOfPages += listedSchoolActivity.getPages();
					}
				}
			}
			latestBadge = checkIfBadgeStudyPoints(0, studyPointsMSecs/10, totalMSecs, currDate, courseName);
			latestBadge = checkIfBadgeStudyPoints(1, studyPointsMSecs/4, totalMSecs, currDate, courseName);
			latestBadge = checkIfBadgeStudyPoints(2, studyPointsMSecs/2, totalMSecs, currDate, courseName);
			latestBadge = checkIfBadgeStudyPoints(3, 3*studyPointsMSecs/4, totalMSecs, currDate, courseName);
			latestBadge = checkIfBadgeStudyPoints(4, 9*studyPointsMSecs/10, totalMSecs, currDate, courseName);
			latestBadge = checkIfBadgeStudyPoints(5, studyPointsMSecs, totalMSecs, currDate, courseName);
			latestBadge = checkIfBadgePages(6, 50, amountOfPages, currDate, courseName);
			latestBadge = checkIfBadgePages(7, 100, amountOfPages, currDate, courseName);
			latestBadge = checkIfBadgePages(8, 200, amountOfPages, currDate, courseName);
			latestBadge = checkIfBadgePages(9, 300, amountOfPages, currDate, courseName);
		}
	}
	
	/**
	 * Hierin worden de verschillende badges geladen, met badges[0] t.e.m. badges[5] badges ivm. studiepunten
	 * en badges[6] t.e.m. badges[9] badges ivm. het aantal pagina's geleerd.
	 */
	private void loadBadges()
	{
		badges[0] = new Badge("10% van het aantal studiepunten", "Gefeliciteerd, u hebt nu 10% van het vooropgesteld aantal uren geleerd!", "aantaluur", 10);
		badges[1] = new Badge("25% van het aantal studiepunten", "Proficiat, u hebt nu 25% van het vooropgesteld aantal uren geleerd!", "aantaluur", 25);
		badges[2] = new Badge("50% van het aantal studiepunten", "Gefeliciteerd, u hebt nu 50% van het vooropgesteld aantal uren geleerd!", "aantaluur", 50);
		badges[3] = new Badge("75% van het aantal studiepunten", "Proficiat, u hebt nu 75% van het vooropgesteld aantal uren geleerd!", "aantaluur", 75);
		badges[4] = new Badge("90% van het aantal studiepunten", "Zalig, u hebt nu 90% van het vooropgesteld aantal uren geleerd! Je bent bijna klaar voor het examen.", "aantaluur", 90);
		badges[5] = new Badge("100% van het aantal studiepunten", "Wow! Je hebt nu 100% van het vooropgesteld aantal uren geleerd! Je zou nu klaar moeten zijn voor het examen.", "aantaluur", 100);
		badges[6] = new Badge("50 paginas geleerd", "Gefeliciflapstaart, u heeft de eerste 50 paginas al achter de rug!", "aantalpaginas", 50);
		badges[7] = new Badge("100 paginas geleerd", "Gefeliciflapstaart, u heeft al 100 paginas achter de rug!", "aantalpaginas", 100);
		badges[8] = new Badge("200 paginas geleerd", "Gefeliciflapstaart, u heeft de eerste 200 paginas al achter de rug!", "aantalpaginas", 200);
		badges[9] = new Badge("300 paginas geleerd", "Gefeliciflapstaart, u heeft al 300 paginas achter de rug!", "aantalpaginas", 300);
	}
	
	/**
	 * Als totalMSecs (het aantal milliseconde dat de student aan dat vak reeds geleerd heeft) groter of gelijk is
	 * aan studyPointsMSecs (een deel van het aantal milliseconden dat je aan dat vak zou moeten spenderen, SP*27.5*60*60*1000)
	 * dan wordt de lijst met badges die de student al behaald heeft afgegaan en gekeken of de badge met die
	 * courseName & Name al in de lijst zit, zoniet wordt de badge aan de student gegeven.
	 * @param i de plaats van de badge in de lijst badges, er wordt gecontroleerd of de student badges[i] al heeft voor dat vak
	 * @param studyPointsMSecs een deel van het aantal milliseconden dat je aan dat vak zou moeten spenderen, SP*27.5*60 
	 * @param totalMSecs het aantal milliseconden dat de student aan dat vak reeds geleerd heeft
	 * @param date de datum wanneer de badge behaald is
	 * @param courseName de naam van het vak
	 */
	private Badge checkIfBadgeStudyPoints(int i, long studyPointsMSecs, long totalMSecs, Date date, String courseName)
	{
		if(totalMSecs >= studyPointsMSecs)
		{
			boolean found = false;
			int j = 0;
			while(j != studentsBadges.size() && !found)
			{
				if(studentsBadges.get(j).getCourseName().equals(courseName) && studentsBadges.get(j).getName().equals(badges[i].getName()))
				{
					found = true;
				}
				j++;
			}
			if(!found)
			{
				Badge addedBadge = badges[i];
				addedBadge.setDate(date);
				addedBadge.setCourseName(courseName);
				studentsBadges.add(addedBadge);
				currStudent.setBadges(studentsBadges);
				return addedBadge;
			}
			else {
				return null;
			}
		}
		else {
			return null;
		}
	}
	
	/**
	 * Als pagesStudied (het aantal pagina's dat de student reeds geleerd heeft) groter of gelijk is
	 * aan pages (een vooropgesteld doel, bvb. 50, 100, 200,... paginas)
	 * dan wordt de lijst met badges die de student al behaald heeft afgegaan en gekeken of de badge met die
	 * courseName & Name al in de lijst zit, zoniet wordt de badge aan de student gegeven.
	 * @param i de plaats van de badge in de lijst badges, er wordt gecontroleerd of de student badges[i] al heeft voor dat vak
	 * @param pages een vooropgesteld doel, bvb. 50, 100, 200,... paginas
	 * @param pagesStudied het aantal pagina's dat de student reeds geleerd heeft
	 * @param date de datum wanneer de badge behaald is
	 * @param courseName de naam van het vak
	 */
	private Badge checkIfBadgePages(int i, int pages, int pagesStudied, Date date, String courseName)
	{
		if(pagesStudied >= pages)
		{
			boolean found = false;
			int j = 0;
			while(j != studentsBadges.size() && !found)
			{
				if(studentsBadges.get(j).getCourseName().equals(courseName) && studentsBadges.get(j).getName().equals(badges[i].getName()))
				{
					found = true;
				}
				j++;
			}
			if(!found)
			{
				Badge addedBadge = badges[i];
				addedBadge.setDate(date);
				addedBadge.setCourseName(courseName);
				studentsBadges.add(addedBadge);
				currStudent.setBadges(studentsBadges);
				return addedBadge;
			}
			else {
				return null;
			}
		}
		else {
			return null;
		}
	}

	public Badge getLatestBadge() {
		return latestBadge;
	}
}
